<?php
/**
 * Created by : PhpStorm
 * User: Shane
 * Date: 2023-03-10
 * Time: 16:11
 * 自定义数据验证
 */

namespace control;


class MqSearch
{
    const RULE_PREFIX="rule_";
    /**
     * 搜索验证器 测试示例
     * "name|name1" name表示请求参数 name1表示数据库字段名
     * "date|>=" date 代表日期格式检验 >=代表搜索条件
     */
    private function checkFromData(){
        $datas=["name"=>""];
        $rules=[
            "index"=>[
                "name|name1"=>"date|>=",
            ],
        ];
        $where=self::baseCheck($rules,$datas);
    }
    /**
     * @param $rules
     * @param $datas
     * 核心处理 获取验证后组装的where搜索条件
     */
    public static function baseCheck($rules,$datas){
        $where=[];
        if(isset($rules) && is_array($rules)){
            foreach ($rules as $k=>$v){
                list($name,$fieldName)=explode('|',$k);
                list($rule,$lable)=explode('|',$v);
                $ruleAction=self::RULE_PREFIX.$rule;
                $checkRes=self::$ruleAction(@$datas[$name]);
                if($checkRes !== false){
                    $checkWhere=self::whereHandle($lable,$fieldName,$checkRes);
                    if($checkWhere !== false) $where[]=$checkWhere;
                }
            }
        }
        return $where;
    }
    /**
     * @param $label
     * @param $field
     * @param $data
     * @return array|string
     * 处理搜索条件
     */
    public static function whereHandle($label,$field,$data){
        switch ($label){
            case ">=":
                return [$field, '>=', $data];
            case "<=":
                return [$field, '<=', $data];
            case "=":
                return [$field, '=',   $data];
            case "<>":
                return [$field, '<>', $data];
            case "<":
                return [$field, '<',  $data];
            case ">":
                return [$field, '>',  $data];
            case "like":
                return [$field, 'like', '%'.$data.'%'];
            case "in":
                return [$field, 'in', $data];
            case "notin":
                return [$field, 'not in', $data];
            default :
                return false;
        }
    }

    /**
     * @param $data
     * @return bool
     * 通常非空判断
     */
    public static function rule_normal($data){
        if($data){
            return $data;
        }else{
            return false;
        }
    }
    /**
     * @param $data
     * 字符串分割为数组
     */
    public static function rule_string_arr($data){
        if($data && is_string($data)){
            return explode(",",$data);
        }else{
            return false;
        }
    }
    /**
     * @param $data
     * 日期格式验证且转换为时间戳
     */
    public static function rule_date_time($data){
        $res=preg_match('/^\d{4}[\-](0?[1-9]|1[012])[\-](0?[1-9]|[12][0-9]|3[01])(\s+(0?[0-9]|1[0-9]|2[0-3])\:(0?[0-9]|[1-5][0-9])\:(0?[0-9]|[1-5][0-9]))?$/', $data);
        return $res>0?strtotime($data):false;
    }
    /**
     * @param $data
     * 时间戳验证且转换为日期格式
     */
    public static function rule_time_date($data){
        if(is_numeric($data) && strlen($data)==10){
            return date("Y-m-d H:i:s",$data);
        }else{
            return false;
        }
    }
    /**
     * @param $data
     * 日期格式验证
     */
    public static function rule_date($data){
        $res=preg_match('/^\d{4}[\-](0?[1-9]|1[012])[\-](0?[1-9]|[12][0-9]|3[01])(\s+(0?[0-9]|1[0-9]|2[0-3])\:(0?[0-9]|[1-5][0-9])\:(0?[0-9]|[1-5][0-9]))?$/', $data);
        return $res>0?$data:false;
    }
    /**
     * @param $data
     * 时间戳验证
     */
    public static function rule_time($data){
        if(is_numeric($data) && strlen($data)==10){
            return $data;
        }else{
            return false;
        }
    }

}